/*
 * @Author       : wang chao
 * @Date         : 2023-08-21 13:07:07
 * @LastEditors: wangchao
 * @LastEditTime: 2024-10-08 08:05:50
 * @FilePath: \JD-RTT-Driver\applications\u_params.c
 * @Description  :
 * Copyright 2023 BingShan, All Rights Reserved.
 */
#include "u_params.h"
#include "at24cxx.h"

#define DBG_TAG "PARAMS"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>

static rt_int16_t func_params[FUNC_PARAMS_LENGTH] = {0};

void system_func_params_init(void)
{
    rt_int16_t index = 0;
    rt_int16_t new_board_value = get_func_params_from_eeprom(0x00);

    LOG_I("New board value:0x%x", new_board_value);

    if (new_board_value != NEW_BOARD_BYTE_FALG)
    {
        LOG_I("This is a new board, we have write default params.");
        //
        reset_default_params();
        //
        set_func_params(0, NEW_BOARD_BYTE_FALG);
    }
    //
    if (1)
    {
        LOG_I("Get params from eeprom.");
        for (index = 1; index < FUNC_PARAMS_LENGTH; index++)
        {
            get_func_params_from_eeprom(index);
        }
    }
    LOG_I("System func params init success.");
}

void reset_eeporm(void)
{
    for (int index = 0; index < FUNC_PARAMS_LENGTH; index++)
    {
        set_func_params(index, 0xFFFF);
    }
}

MSH_CMD_EXPORT(reset_eeporm, reset eeporm to 0xFF);

rt_int16_t get_func_params_from_eeprom(rt_uint16_t index)
{
    rt_int16_t params = 0;
    rt_uint16_t addr = FUNC_PARAMS_BASE_ADDR + index * 4;
    params = e2rm_load_word(addr);
    func_params[index] = params;
    rt_thread_mdelay(5);
    return params;
}

rt_int16_t get_func_params_from_ram(rt_uint16_t index)
{
    return func_params[index];
}

void set_func_params(rt_uint16_t index, rt_int16_t value)
{
    rt_uint16_t addr = FUNC_PARAMS_BASE_ADDR + index * 4;
    func_params[index] = value;
    e2rm_storage_word(addr, func_params[index]);
    rt_thread_mdelay(5);
    return;
}

/**
 *  @------用户自定义参数------
 */

rt_int16_t get_alarm_params(rt_uint16_t index)
{
    if (index >= 1 && index < 20)
    {
        return get_func_params_from_ram(index);
    }
}

void set_alarm_params(rt_uint16_t index, rt_int16_t value)
{
    if (index >= 1 && index < 20)
    {
        set_func_params(index, value);
    }
}

rt_int16_t get_fault_params(rt_uint16_t index)
{
    rt_uint16_t base = 0;
    if (index >= 1 && index <= 20)
    {
        base = index + 19;
        return get_func_params_from_ram(base);
    }
}

void set_fault_params(rt_uint16_t index, rt_int16_t value)
{
    rt_uint16_t base = 0;
    if (index >= 1 && index <= 20)
    {
        base = index + 19;
        set_func_params(base, value);
    }
}

rt_int16_t get_app_params(rt_uint16_t index)
{
    rt_uint16_t base = 0;
    if (index >= 1 && index <= 60)
    {
        base = index + 39;
        return get_func_params_from_ram(base);
    }
}

void set_app_params(rt_uint16_t index, rt_int16_t value)
{
    rt_uint16_t base = 0;
    if (index >= 1 && index <= 60)
    {
        base = index + 39;
        set_func_params(base, value);
    }
}

static rt_int16_t net_params[NET_ADDR_LENGTH] = {0};

rt_int16_t get_ip_address_from_eeprom(rt_uint16_t index)
{
    rt_int16_t params = 0;
    rt_uint16_t addr = NET_ADDR_BASE_ADDR + index * 4;
    params = e2rm_load_word(addr);
    net_params[index] = params;
    rt_thread_mdelay(5);
    return params;
}

void set_net_params(rt_uint16_t index, rt_int16_t value)
{
    rt_uint16_t addr = NET_ADDR_BASE_ADDR + index * 4;
    net_params[index] = value;
    e2rm_storage_word(addr, net_params[index]);
    rt_thread_mdelay(5);
    return;
}

rt_int16_t get_net_params_list(rt_uint16_t index)
{
    return net_params[index];
}

void system_eth_net_init(void)
{
    char net_mask[15] = {0};
    char ip_addr[15] = {0};
    char gate_way[15] = {0};
    //
    for (rt_uint8_t index = 0; index < 12; index++)
    {
        get_ip_address_from_eeprom(index);
    }
    //
    rt_sprintf(net_mask, "%d.%d.%d.%d", net_params[0], net_params[1], net_params[2], net_params[3]);
    rt_sprintf(ip_addr, "%d.%d.%d.%d", net_params[4], net_params[5], net_params[6], net_params[7]);
    rt_sprintf(gate_way, "%d.%d.%d.%d", net_params[8], net_params[9], net_params[10], net_params[11]);
    LOG_I("Local Eth IP:%s, Gateway:%s, Netmask:%s", ip_addr, gate_way, net_mask);
    //
    extern void set_if(char* netif_name, char* ip_addr, char* gw_addr, char* nm_addr);
    //
    set_if("et", ip_addr, gate_way, net_mask);
    //
    LOG_I("Set Local Eth Net Params Success");
}

// 默认参数设置
void reset_default_params(void)
{
    // 、、、、、、、、、、、、、、、、
    //     电池电压过高阈值
    set_fault_params(1, 850);
    //     电池电压过低阈值
    set_fault_params(2, 120);
    //     电池电压异常阈值
    set_fault_params(3, 50);
    //     电池电流过高阈值
    set_fault_params(4, 12000);
    //     电池过载高阈值
    set_fault_params(5, 7500);
    //     电解液温度异常高阈值
    set_fault_params(6, 500);
    //     电解液温度异常低阈值
    set_fault_params(7, 200);
    //     电池容量低阈值
    set_fault_params(8, 100);
    //     储罐压力上限
    set_fault_params(9, 2000);
    //     储罐压力下限
    set_fault_params(10, -2000);
    //     出口压力上限
    set_fault_params(11, 2400);
    //     出口压力下限
    set_fault_params(12, 50);
    // 、、、、、、、、、、、、、、、、
    // 立即执行_充放顺序
    set_app_params(17, 0x1);
    // 立即执行_循环次数
    set_app_params(18, 0x1);
    // 充放切换静置时间
    set_app_params(20, 3);
    // 【充电】充电前静置时间-分
    set_app_params(21, 2);
    // 【充电】分段设置
    set_app_params(22, 1);
    // 【充电】1段模式：恒功率
    set_app_params(23, 2);
    // 【充电】2段模式：恒电流
    set_app_params(24, 3);
    // 【充电】1段充电参数设置
    set_app_params(25, 4500);
    // 【充电】1段充电截至参数设置
    set_app_params(26, 6800);
    // 【充电】2段充电参数设置
    set_app_params(27, 5000);
    // 【充电】2段充电截至参数设置
    set_app_params(28, 6800);
    // 、、、、、、、、、、、、、、、、
    // 【放电】放电前静置时间-分
    set_app_params(29, 2);
    // 【放电】分段设置
    set_app_params(30, 1);
    // 【放电】1段模式
    set_app_params(31, 2);
    // 【放电】2段模式
    set_app_params(32, 3);
    // 【放电】1段充电参数设置
    set_app_params(33, -2500);
    // 【放电】1段充电截至参数设置
    set_app_params(34, 2400);
    // 【放电】2段充电参数设置
    set_app_params(35, -2500);
    // 【放电】2段充电截至参数设置
    set_app_params(36, 1200);
    //  H0_plus参数设置
    set_app_params(37, 50);
    // 默认初始频率24HZ
    set_app_params(38, 2400);
    // 、、、、、、、、、、、、、、、、
    // PCS-SLAVE-ID
    set_app_params(55, 1);
    // PCS-IP-BIT0
    set_app_params(56, 192);
    // PCS-IP-BIT1
    set_app_params(57, 168);
    // PCS-IP-BIT2
    set_app_params(58, 1);
    // PCS-IP-BIT3
    set_app_params(59, 110);
    // PCS-端口
    set_app_params(60, 502);
    // 、、、、、、、、、、、、、、、、
    set_net_params(0, 255);
    set_net_params(1, 255);
    set_net_params(2, 255);
    set_net_params(3, 0);
    //
    set_net_params(4, 192);
    set_net_params(5, 168);
    set_net_params(6, 1);
    set_net_params(7, 122);
    //
    set_net_params(8, 192);
    set_net_params(9, 168);
    set_net_params(10, 1);
    set_net_params(11, 1);
}

#ifdef RT_USING_FINSH
#include <finsh.h>
void reset_params(void)
{
    reset_default_params();
    LOG_I("======>@reset default params done.");
}
MSH_CMD_EXPORT(reset_params, reset default params);
#endif
